1 Dataset overview.

1.1 Tab 1

1.1.1 Description of the Dataset

Import, explain the variables, and cite the source(s)

Student_Attitude_and_Behavior <- read.csv("~/DATA612/project/Student Attitude and Behavior.csv")
cat(" There are", nrow(Student_Attitude_and_Behavior), "rows, and", ncol(Student_Attitude_and_Behavior),"columns in the Student_Attitude_and_Behavior data." )
##  There are 235 rows, and 19 columns in the Student_Attitude_and_Behavior data.
  • Student Attitude and Behavior The data from the kaggle website, which collects various information about college students through Google Forms to analyze student behavior and attitudes. This data has a total of 19 variables, which includes certification courses, gender, department, height (in cm), weight (in kg), marks in 10th and 12th grade, college marks, hobbies, daily studying time, preferred study environment, salary expectations, satisfaction with their degree and other detailed information. We will present graphical analysis as well as regression analysis for these variables.
name1 = colnames(Student_Attitude_and_Behavior)[1]
name2 = colnames(Student_Attitude_and_Behavior)[2]
names(Student_Attitude_and_Behavior)
##  [1] "Certification.Course"                                
##  [2] "Gender"                                              
##  [3] "Department"                                          
##  [4] "Height.CM."                                          
##  [5] "Weight.KG."                                          
##  [6] "X10th.Mark"                                          
##  [7] "X12th.Mark"                                          
##  [8] "college.mark"                                        
##  [9] "hobbies"                                             
## [10] "daily.studing.time"                                  
## [11] "prefer.to.study.in"                                  
## [12] "salary.expectation"                                  
## [13] "Do.you.like.your.degree."                            
## [14] "willingness.to.pursue.a.career.based.on.their.degree"
## [15] "social.medai...video"                                
## [16] "Travelling.Time"                                     
## [17] "Stress.Level"                                        
## [18] "Financial.Status"                                    
## [19] "part.time.job"

1.2 Tab 2

1.2.1 Clean and tidy data

is_tibble(Student_Attitude_and_Behavior)
## [1] FALSE
as_tibble(Student_Attitude_and_Behavior) -> SAB

is_tibble(SAB)
## [1] TRUE
glimpse(SAB)
## Rows: 235
## Columns: 19
## $ Certification.Course                                 <chr> "No", "No", "Yes"…
## $ Gender                                               <chr> "Male", "Female",…
## $ Department                                           <chr> "BCA", "BCA", "BC…
## $ Height.CM.                                           <dbl> 100, 90, 159, 147…
## $ Weight.KG.                                           <dbl> 58, 40, 78, 20, 5…
## $ X10th.Mark                                           <dbl> 79.0, 70.0, 71.0,…
## $ X12th.Mark                                           <dbl> 64.00, 80.00, 61.…
## $ college.mark                                         <dbl> 80, 70, 55, 58, 3…
## $ hobbies                                              <chr> "Video Games", "C…
## $ daily.studing.time                                   <chr> "0 - 30 minute", …
## $ prefer.to.study.in                                   <chr> "Morning", "Morni…
## $ salary.expectation                                   <int> 40000, 15000, 130…
## $ Do.you.like.your.degree.                             <chr> "No", "Yes", "Yes…
## $ willingness.to.pursue.a.career.based.on.their.degree <chr> "50%", "75%", "50…
## $ social.medai...video                                 <chr> "1.30 - 2 hour", …
## $ Travelling.Time                                      <chr> "30 - 60 minutes"…
## $ Stress.Level                                         <chr> "Bad", "Bad", "Aw…
## $ Financial.Status                                     <chr> "Bad", "Bad", "Ba…
## $ part.time.job                                        <chr> "No", "No", "No",…
sum(is.na(SAB))
## [1] 0
summary(SAB)
##  Certification.Course    Gender           Department          Height.CM.   
##  Length:235           Length:235         Length:235         Min.   :  4.5  
##  Class :character     Class :character   Class :character   1st Qu.:152.0  
##  Mode  :character     Mode  :character   Mode  :character   Median :160.0  
##                                                             Mean   :157.4  
##                                                             3rd Qu.:170.0  
##                                                             Max.   :192.0  
##    Weight.KG.      X10th.Mark      X12th.Mark     college.mark   
##  Min.   : 20.0   Min.   : 7.40   Min.   :45.00   Min.   :  1.00  
##  1st Qu.: 50.0   1st Qu.:70.00   1st Qu.:60.00   1st Qu.: 60.00  
##  Median : 60.0   Median :80.00   Median :69.00   Median : 70.00  
##  Mean   : 60.8   Mean   :76.85   Mean   :68.78   Mean   : 70.66  
##  3rd Qu.: 70.0   3rd Qu.:86.25   3rd Qu.:76.00   3rd Qu.: 80.00  
##  Max.   :106.0   Max.   :98.00   Max.   :94.00   Max.   :100.00  
##    hobbies          daily.studing.time prefer.to.study.in salary.expectation
##  Length:235         Length:235         Length:235         Min.   :      0   
##  Class :character   Class :character   Class :character   1st Qu.:  15000   
##  Mode  :character   Mode  :character   Mode  :character   Median :  20000   
##                                                           Mean   :  32482   
##                                                           3rd Qu.:  25000   
##                                                           Max.   :1500000   
##  Do.you.like.your.degree. willingness.to.pursue.a.career.based.on.their.degree
##  Length:235               Length:235                                          
##  Class :character         Class :character                                    
##  Mode  :character         Mode  :character                                    
##                                                                               
##                                                                               
##                                                                               
##  social.medai...video Travelling.Time    Stress.Level       Financial.Status  
##  Length:235           Length:235         Length:235         Length:235        
##  Class :character     Class :character   Class :character   Class :character  
##  Mode  :character     Mode  :character   Mode  :character   Mode  :character  
##                                                                               
##                                                                               
##                                                                               
##  part.time.job     
##  Length:235        
##  Class :character  
##  Mode  :character  
##                    
##                    
## 

We change variables name here.

SAB <- SAB %>%
  rename(degree_prefer =Do.you.like.your.degree.) %>%
  rename(career_willingness = willingness.to.pursue.a.career.based.on.their.degree)%>%
  mutate(Department = gsub("B.com ISM", "ISM", Department))%>%
  mutate(Department = gsub("B.com Accounting and Finance ", "Accounting and Finance", Department))

1.3 Tab 3

1.3.1 An interactive table

datatable(SAB, rownames = FALSE, filter="top", options = list(pageLength = 5, scrollX=T) )

2 Graphs for the Dataset

2.1 Qualitative Variable

Based on the dataset, we can see that males outnumber females. Also, we are interested in the distribution of gender across other variables.

# We delete other bars only preserve the gender bar plot

bar1<- ggplot(SAB, aes(x= Gender))+
  geom_bar(fill="skyblue")+
  labs(title ="Gender Distribution")

bar1

Below is the distribution of students’ time spent on social media and travelling time.

bar4<- ggplot(SAB, aes(x= social.medai...video))+
  geom_bar(fill="skyblue")+
  theme(axis.text.x= element_text(angle = 45, hjust = 1))


bar5<- ggplot(SAB, aes(x= Travelling.Time))+
  geom_bar(fill="skyblue")+
  theme(axis.text.x= element_text(angle = 45, hjust = 1))

bar4+bar5

We create some plot that compares gender across departments and certification levels.

#we add percentage point here

SAB %>%
  count(Department, Gender) %>%
  group_by(Department) %>%
  mutate(perc = n / sum(n) * 100) %>%
  ggplot(aes(x = Department, y = n, fill = Gender, label = sprintf("%.1f%%", perc))) +
  geom_bar(stat = "identity", position = "dodge") +
  geom_text(position = position_dodge(width = 0.9), vjust = -0.25, size = 3) + 
  labs(title = "Department vs Gender", x = "Department", y = "Count") +
  theme_minimal() +
  theme(axis.text.x = element_text(angle = 45, hjust = 1))

Based on the distribution, we found that most of the students completed certification course.

# We recreate the bar plot by changing x and y

ggplot(SAB, aes(x = Gender, fill = Certification.Course)) +
  geom_bar(position = "dodge") +
  labs(title = "Certification.Course vs Gender", x = "Count", y = "Certification.Course") +
  theme_minimal()

Here is the stress level among gender, most of the students are in good status.

#we add percentage point here

stress_gender <- SAB %>%
  group_by(Stress.Level, Gender) %>%
  summarise(count = n(), .groups = 'drop') %>%
  group_by(Gender) %>%
  mutate(percentage = (count / sum(count)) * 100)

ggplot(stress_gender, aes(x = Gender, y = count, fill = Stress.Level)) +
  geom_bar(stat = "identity", position = "dodge") +
  geom_text(aes(label = sprintf("%.1f%%", percentage)), 
            position = position_dodge(width = 0.9), vjust = -0.5, size = 2.5) + 
  labs(title = "Gender vs Stress", x = "Gender", y = "Count") +
  theme_minimal()

Here is the breakdown of hobbies and study time. Most of them study for 30 to 60 minutes. We discovered that students who play video games cannot study for more than four hours.

# We add the daily.studing.time bar here

hobby_studytime<- SAB%>% 
  group_by(hobbies, daily.studing.time) %>% 
  summarise(count = n())
## `summarise()` has grouped output by 'hobbies'. You can override using the
## `.groups` argument.
study1<- ggplot(hobby_studytime, aes(x = hobbies, y = count, fill = daily.studing.time)) +
  geom_bar(stat = "identity", position = "dodge") +
  labs(title = "hobby v.s. studytime", x = "hobbies", y = "Count") +
  theme_minimal()+
  theme(axis.text.x= element_text(angle = 45, hjust = 1))

study2<-ggplot(SAB, aes(x=daily.studing.time ))+
  geom_bar(fill= "skyblue")+
  theme(axis.text.x= element_text(angle = 45, hjust = 1))

study1+study2


3 Correlation Map

SAB2 <- SAB
SAB2$Gender <- as.numeric(as.factor(SAB2$Gender))
numeric_data <- SAB2[, sapply(SAB2, is.numeric)]
cor_matrix <- cor(numeric_data, use = "complete.obs")
corrplot(cor_matrix, method = "color", type = "upper", order = "hclust",
         tl.col = "black", tl.srt = 45, 
         addCoef.col = "black")

3.0.0.1 This correlation plot provides the correlation coefficients between different pairs of variables, which quantify the strength and direction of the linear relationship between them.

  • college.mark and X10th.Mark (0.47): There’s a moderate positive correlation between marks in the 10th grade and college, suggesting that higher marks in the 10th grade are associated with higher college marks.

  • college.mark and X12th.Mark (0.42): This indicates a moderate positive correlation between 12th-grade marks and college marks.

  • college.mark and other variables: The correlation coefficients with other variables like salary expectation, height, gender, and weight are close to zero, indicating a very weak to no linear relationship with college marks.

  • X10th.Mark and X12th.Mark (0.47): This shows a moderate positive correlation, indicating that students who perform well in the 10th grade also tend to perform well in the 12th grade.

  • Height.CM. and Weight.KG. (0.28): A positive correlation here suggests that as height increases, weight also tends to increase, which is a common physiological correlation.

  • Gender and Weight.KG. (0.49): This suggests a moderate positive correlation, which might indicate that one gender (coded numerically) tends to weigh more on average.

  • Other Correlations: Correlations involving salary expectation, height, and gender with 10th and 12th-grade marks are weak, as indicated by coefficients closer to zero.


4 Influence of Study Habits on Academic Success

4.1 Is there a relationship between daily studying time and college marks?

SAB$daily.studing.time <- factor(SAB$daily.studing.time, 
                                      levels = c("0 - 30 minute", "30 - 60 minute", 
                                                 "1 - 2 Hour", "2 - 3 hour", 
                                                 "3 - 4 hour", "More Than 4 hour"))
ggplot(SAB, aes(x = daily.studing.time, y = college.mark, fill=daily.studing.time)) +
  geom_boxplot() +
  labs(title = "College Marks by Daily Studying Time", x = "Daily Studying Time", y = "College Marks")

4.1.1 This boxplot illustrates the distribution of college marks across different categories of daily studying time.

  1. Students who studied for 0 to 30 minutes a day and those who studied for 30 to 60 minutes seemed to perform similarly.

  2. The 1 - 2 hour boxes are taller in comparison, indicating a greater difference in scores for these students.

  3. The 3 - 4 hour : Students in this category have a slightly higher median mark than the previous groups.

  4. More than 4 hour : The median number of students who study for more than 4 hours is relatively low. It can be seen that the more time they study, the score performance of students will not necessarily increase.

This indicate that quality, rather than quantity, of study time is crucial.

lm_studytime <- lm(college.mark ~ daily.studing.time, SAB)
summary(lm_studytime)
## 
## Call:
## lm(formula = college.mark ~ daily.studing.time, data = SAB)
## 
## Residuals:
##    Min     1Q Median     3Q    Max 
## -69.32  -8.69   1.31  10.14  29.68 
## 
## Coefficients:
##                                    Estimate Std. Error t value Pr(>|t|)    
## (Intercept)                         68.6904     2.3171  29.645   <2e-16 ***
## daily.studing.time30 - 60 minute     1.1738     2.9013   0.405   0.6862    
## daily.studing.time1 - 2 Hour         1.6271     3.0688   0.530   0.5965    
## daily.studing.time2 - 3 hour         7.2387     3.9572   1.829   0.0687 .  
## daily.studing.time3 - 4 hour         6.8296     4.6726   1.462   0.1452    
## daily.studing.timeMore Than 4 hour  -0.9404     6.0199  -0.156   0.8760    
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 15.72 on 229 degrees of freedom
## Multiple R-squared:  0.0229, Adjusted R-squared:  0.001563 
## F-statistic: 1.073 on 5 and 229 DF,  p-value: 0.3759
  1. The median of the residuals is 1.31, which is close to 0, suggesting that, on average, the model doesn’t systematically over- or under-predict.

  2. The p values associated with these coefficients are all above 0.05, indicating that neither increases nor decreases in study time are statistically significant predictors of college performance.

In summary, the linear model indicates that there is no strong evidence of a relationship between college.mark and daily.studing.time, given the lack of statistical significance for the coefficients and the low R-squared values. The most substantial association seen is with the “2 - 3 hour” study group, which might suggest a slight increase in college marks, but this is not statistically significant at the 5% level.


5 Social and Economic Factors Influencing Student Life

5.1 Plotting college marks by Stress.Level

What is the impact of financial status on students’ stress levels and academic performance?

SAB$Financial.Status <- as.factor(SAB$Financial.Status)
SAB$Stress.Level <- as.factor(SAB$Stress.Level)
SAB$college.mark <- as.numeric(SAB$college.mark)
ggplot(SAB, aes(x = Financial.Status, y = college.mark, fill = Financial.Status)) +
  geom_boxplot() +
  labs(title = "College Marks by Financial Status", x = "Financial Status", y = "College Marks")

The “Fabulous” financial status group has the lowest median college mark. The “Awful” financial status group does not have the lowest median college marks.

This could suggest that financial status may not be the primary determinant of academic success or that there are other factors at play.

5.1.1 Regression Analysis for Financial Status and College Marks

SAB$Financial.Status <- factor(SAB$Financial.Status)
lm_financial <- lm(college.mark ~ Financial.Status , SAB)
summary(lm_financial)
## 
## Call:
## lm(formula = college.mark ~ Financial.Status, data = SAB)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -70.392  -9.826   0.357  10.174  28.608 
## 
## Coefficients:
##                          Estimate Std. Error t value Pr(>|t|)    
## (Intercept)               69.6429     4.2248  16.484   <2e-16 ***
## Financial.StatusBad        0.1829     4.5485   0.040    0.968    
## Financial.StatusFabulous  -0.6429     8.9622  -0.072    0.943    
## Financial.Statusgood       1.7491     4.4482   0.393    0.695    
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 15.81 on 231 degrees of freedom
## Multiple R-squared:  0.002693,   Adjusted R-squared:  -0.01026 
## F-statistic: 0.2079 on 3 and 231 DF,  p-value: 0.8909

The model’s results suggest that there is no significant relationship between Financial.Status and college.mark.

Given the lack of statistical significance and the very low R-squared values, Financial.Status alone does not appear to be a good predictor of college.mark in this model. This implies that the impact of financial status on academic performance is not linear.

5.2 Plotting college marks by Stress.Level

stress_financial<- SAB%>% 
  group_by(Stress.Level, Financial.Status) %>% 
  summarise(count = n())
## `summarise()` has grouped output by 'Stress.Level'. You can override using the
## `.groups` argument.
ggplot(stress_financial, aes(x = Financial.Status, y = count, fill = Stress.Level)) +
  geom_bar(stat = "identity", position = "dodge") +
  labs(title = "Financial vs Stress", x = "Financial", y = "Count") +
  theme_minimal()

5.2.1 Regression Analysis for Stress Level and College Marks

SAB$Financial.Status <- as.factor(SAB$Financial.Status)
SAB$Stress.Level <- as.factor(SAB$Stress.Level)
lm_stress_finance <- lm(college.mark ~Stress.Level, SAB)
summary(lm_stress_finance)
## 
## Call:
## lm(formula = college.mark ~ Stress.Level, data = SAB)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -70.540  -8.754   1.246   9.737  28.460 
## 
## Coefficients:
##                      Estimate Std. Error t value Pr(>|t|)    
## (Intercept)            70.263      3.619  19.412   <2e-16 ***
## Stress.LevelBad        -1.509      4.094  -0.369    0.713    
## Stress.Levelfabulous    1.919      5.977   0.321    0.749    
## Stress.LevelGood        1.276      3.862   0.330    0.741    
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 15.78 on 231 degrees of freedom
## Multiple R-squared:  0.006589,   Adjusted R-squared:  -0.006312 
## F-statistic: 0.5108 on 3 and 231 DF,  p-value: 0.6753

The results of this model also show that there is no significant relationship between Stress Level and College.mark because the P-values for different stress levels are all greater than 0.05.

5.3 Mutipule Regression analysis (Financial.Status + Stress.Level)

SAB$Financial.Status <- as.factor(SAB$Financial.Status)
SAB$Stress.Level <- as.factor(SAB$Stress.Level)
lm_stress_finance <- lm(college.mark ~ Financial.Status + Stress.Level, SAB)
summary(lm_stress_finance)
## 
## Call:
## lm(formula = college.mark ~ Financial.Status + Stress.Level, 
##     data = SAB)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -71.024  -8.252   1.748  10.082  27.976 
## 
## Coefficients:
##                          Estimate Std. Error t value Pr(>|t|)    
## (Intercept)               69.4729     5.0670  13.711   <2e-16 ***
## Financial.StatusBad        0.4449     4.6352   0.096    0.924    
## Financial.StatusFabulous  -0.9867     9.0990  -0.108    0.914    
## Financial.Statusgood       1.6366     4.5621   0.359    0.720    
## Stress.LevelBad           -1.6660     4.1845  -0.398    0.691    
## Stress.Levelfabulous       1.8930     6.0793   0.311    0.756    
## Stress.LevelGood           0.9142     3.9745   0.230    0.818    
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 15.87 on 228 degrees of freedom
## Multiple R-squared:  0.008396,   Adjusted R-squared:  -0.0177 
## F-statistic: 0.3218 on 6 and 228 DF,  p-value: 0.9252

The regression analysis indicates that neither Financial.Status nor Stress.Level are significant predictors of college.mark in the context of this model. The adjusted R-squared value being negative is a particularly strong indication that the model has no predictive power.

5.3.1 Add Gender as predictor

lm_stress_finance_gender <- lm(college.mark ~ Financial.Status + Stress.Level+ Gender, SAB)
summary(lm_stress_finance_gender)
## 
## Call:
## lm(formula = college.mark ~ Financial.Status + Stress.Level + 
##     Gender, data = SAB)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -67.229  -7.607   1.771  10.285  29.331 
## 
## Coefficients:
##                          Estimate Std. Error t value Pr(>|t|)    
## (Intercept)               77.1312     5.1782  14.895  < 2e-16 ***
## Financial.StatusBad        0.1160     4.4605   0.026    0.979    
## Financial.StatusFabulous  -1.2834     8.7553  -0.147    0.884    
## Financial.Statusgood      -0.0183     4.4058  -0.004    0.997    
## Stress.LevelBad           -2.1998     4.0281  -0.546    0.586    
## Stress.Levelfabulous       1.9538     5.8495   0.334    0.739    
## Stress.LevelGood           0.4946     3.8254   0.129    0.897    
## GenderMale                -9.3780     2.1364  -4.390 1.74e-05 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 15.27 on 227 degrees of freedom
## Multiple R-squared:  0.08598,    Adjusted R-squared:  0.0578 
## F-statistic: 3.051 on 7 and 227 DF,  p-value: 0.004357

From the coefficient for males is (-9.3780) and p < 0.05, we find that gender appears to be an important predictor in the model, showing a strong impact on college performance, with men expected to score lower than women.


6 Academic performace among Gender

plota <- ggplot(SAB, aes(x = X12th.Mark, y = college.mark, color = Gender, shape= Gender)) +
  geom_jitter(alpha = 1/2, size = 1)+ 
  geom_smooth(method = "lm", se = FALSE)+
  labs(title = "12th grade vs. college.mark among Gender")

ggplotly(plota)
## `geom_smooth()` using formula = 'y ~ x'
plotb <- ggplot(SAB, aes(x = X10th.Mark, y = college.mark, color = Gender, shape= Gender)) +
  geom_jitter(alpha = 1/2, size = 1)+ 
  geom_smooth(method = "lm", se = FALSE)+
  labs(title = "10th grade vs. college.mark among Gender")
ggplotly(plotb)
## `geom_smooth()` using formula = 'y ~ x'
gradeplot1<- ggplot(SAB, aes(x=X10th.Mark, y=college.mark))+
  geom_point(color="#a6bddb")+
  geom_smooth(method= "lm")+
  labs(title = "10th grade vs. college.mark")

gradeplot2<- ggplot(SAB, aes(x=X12th.Mark, y=college.mark))+
  geom_point(color="#a6bddb")+
  geom_smooth(method= "lm")+
  labs(title = "10th grade vs. college.mark")

gradeplot1+gradeplot2
## `geom_smooth()` using formula = 'y ~ x'
## `geom_smooth()` using formula = 'y ~ x'

6.1 Fit the linear model

6.1.1 Score with Gender

lm_score<- lm(college.mark~ X10th.Mark+ X12th.Mark+ Gender, SAB)
tidy(lm_score, conf.int = T)
## # A tibble: 4 × 7
##   term        estimate std.error statistic     p.value conf.low conf.high
##   <chr>          <dbl>     <dbl>     <dbl>       <dbl>    <dbl>     <dbl>
## 1 (Intercept)   21.6      6.58        3.28 0.00118        8.65     34.6  
## 2 X10th.Mark     0.403    0.0749      5.39 0.000000177    0.256     0.551
## 3 X12th.Mark     0.326    0.0897      3.64 0.000339       0.150     0.503
## 4 GenderMale    -6.62     1.85       -3.57 0.000427     -10.3      -2.97

\(Y_i = \beta_0 + \beta_1X_{i1} + \beta_2X_{i2} + \beta_3X_{i3}+ \epsilon_i\),

\(Y_i\) is the student’s marks obtained in college or university,

\(X_{i1}\) is the student’s marks obtained in the 10th grade i,

\(X_{i1}\) is the student’s marks obtained in the 10th grade i,

\(X_{i3}\) is an indicator for male i,

The errors are assumed to have mean 0, constant variance, and are uncorrelated.

The output shows that female students have better academic performance than male’s. Female students have 6.6 higher score, on average, as male students who have the same 10th grade and the same 12th grade.

lm_score11<- lm(college.mark~ X10th.Mark+ X12th.Mark+ part.time.job, SAB)
tidy(lm_score11, conf.int = T)
## # A tibble: 4 × 7
##   term             estimate std.error statistic     p.value conf.low conf.high
##   <chr>               <dbl>     <dbl>     <dbl>       <dbl>    <dbl>     <dbl>
## 1 (Intercept)        13.0      6.32       2.05  0.0414         0.507    25.4  
## 2 X10th.Mark          0.412    0.0768     5.36  0.000000199    0.261     0.563
## 3 X12th.Mark          0.375    0.0910     4.12  0.0000528      0.196     0.554
## 4 part.time.jobYes    1.63     2.32       0.700 0.484         -2.95      6.20

6.1.2 Score without Gender

lm_score2<- lm(college.mark~ X10th.Mark+X12th.Mark, SAB)
tidy(lm_score2, conf.int = T)
## # A tibble: 3 × 7
##   term        estimate std.error statistic     p.value conf.low conf.high
##   <chr>          <dbl>     <dbl>     <dbl>       <dbl>    <dbl>     <dbl>
## 1 (Intercept)   13.2      6.30        2.09 0.0373         0.785    25.6  
## 2 X10th.Mark     0.411    0.0767      5.36 0.000000199    0.260     0.562
## 3 X12th.Mark     0.376    0.0908      4.14 0.0000490      0.197     0.555

6.1.3 Regression Residuals Diagnostics

6.1.3.1 Plot of residuals vs fitted values

aout <- augment(lm_score2)
ggplot(data = aout, mapping = aes(x = .fitted, y = .resid)) +
  geom_point() +
  geom_hline(yintercept = 0)+
  geom_smooth()
## `geom_smooth()` using method = 'loess' and formula = 'y ~ x'

Residuals seem to be centered at 0 for all X, we conclude that a linear model is appropriate.

6.1.3.2 QQ plot of residuals

We need to check for normality to verify that we can do a prediction interval

ggplot(data = aout, mapping = aes(sample = .resid)) +
  geom_qq() +
  geom_qq_line(color="blue")

This evaluates the normality of the error terms. Although it has a left long tail, overall looks good.

6.1.4 Prediction

range(SAB$X10th.Mark)
## [1]  7.4 98.0
range(SAB$X12th.Mark)
## [1] 45 94
df1 <- data.frame(X10th.Mark = c(70, 80), X12th.Mark= c(34, 87))
predict(lm_score2, newdata = df1, interval = "confidence")
##       fit      lwr      upr
## 1 54.7717 48.71221 60.83119
## 2 78.8071 75.28575 82.32845

Based on the output provided, we predict that students who score 70 points in the 10th grade and 34 points in the 12th grade are likely to achieve around 55 points for their college grade. (95% Confident Interval 49 to 61) Students obtained 80 points in the 10th grade, and 87 points in the 12th grade will get about 79 points for college grade.(95% Confident Interval 75 to 82)


7 Career Orientation and Academic Choices

  • How does satisfaction with their degree influence students’ willingness to pursue a career in their field of study?
SAB_degree<-SAB%>%
  group_by(degree_prefer)%>%
  count()%>%
  mutate(frequency = n / 235)

SAB_degree2<-SAB%>%
  group_by(degree_prefer, Department)%>%
  count()%>%
  mutate(frequency = n / 235)

SAB_degree
## # A tibble: 2 × 3
## # Groups:   degree_prefer [2]
##   degree_prefer     n frequency
##   <chr>         <int>     <dbl>
## 1 No               20    0.0851
## 2 Yes             215    0.915
SAB_degree2
## # A tibble: 8 × 4
## # Groups:   degree_prefer, Department [8]
##   degree_prefer Department                 n frequency
##   <chr>         <chr>                  <int>     <dbl>
## 1 No            Accounting and Finance     1   0.00426
## 2 No            BCA                       16   0.0681 
## 3 No            Commerce                   1   0.00426
## 4 No            ISM                        2   0.00851
## 5 Yes           Accounting and Finance    14   0.0596 
## 6 Yes           BCA                      116   0.494  
## 7 Yes           Commerce                  59   0.251  
## 8 Yes           ISM                       26   0.111

91% of student like their degree, especially the The Business Cinematic Arts (BCA) program(49%).

  • Are students who complete certification courses more likely to have higher salary expectations and a willingness to pursue related careers?
t.test(SAB$salary.expectation ~ SAB$Certification.Course)
## 
##  Welch Two Sample t-test
## 
## data:  SAB$salary.expectation by SAB$Certification.Course
## t = -1.627, df = 156.06, p-value = 0.1058
## alternative hypothesis: true difference in means between group No and group Yes is not equal to 0
## 95 percent confidence interval:
##  -40599.500   3925.622
## sample estimates:
##  mean in group No mean in group Yes 
##          20621.19          38958.13

Since the p-value (0.1058) is greater than 0.05, we fail to reject the null hypothesis. There is not enough evidence that there is a significant difference in mean salary expectations between students who completed certification courses and those who did not.

SAB%>%
  group_by(Gender , Certification.Course) %>%
  summarise(MeanSalary = mean(salary.expectation))
## `summarise()` has grouped output by 'Gender'. You can override using the
## `.groups` argument.
## # A tibble: 4 × 3
## # Groups:   Gender [2]
##   Gender Certification.Course MeanSalary
##   <chr>  <chr>                     <dbl>
## 1 Female No                       16876.
## 2 Female Yes                      47455.
## 3 Male   No                       22145.
## 4 Male   Yes                      34140.

8 Appendix

knitr::opts_chunk$set(echo = TRUE)
library(tidyverse)
library(ggplot2)
library(dplyr)
library(GGally)
library(broom)
library(gridExtra)
library(DT)
library(patchwork)
library(ggthemes)
library(plotly)
library(gapminder)
library(corrplot)
library(car)
Student_Attitude_and_Behavior <- read.csv("~/DATA612/project/Student Attitude and Behavior.csv")
cat(" There are", nrow(Student_Attitude_and_Behavior), "rows, and", ncol(Student_Attitude_and_Behavior),"columns in the Student_Attitude_and_Behavior data." )
name1 = colnames(Student_Attitude_and_Behavior)[1]
name2 = colnames(Student_Attitude_and_Behavior)[2]
names(Student_Attitude_and_Behavior)
is_tibble(Student_Attitude_and_Behavior)

as_tibble(Student_Attitude_and_Behavior) -> SAB

is_tibble(SAB)

glimpse(SAB)

sum(is.na(SAB))

summary(SAB)
SAB <- SAB %>%
  rename(degree_prefer =Do.you.like.your.degree.) %>%
  rename(career_willingness = willingness.to.pursue.a.career.based.on.their.degree)%>%
  mutate(Department = gsub("B.com ISM", "ISM", Department))%>%
  mutate(Department = gsub("B.com Accounting and Finance ", "Accounting and Finance", Department))
         
datatable(SAB, rownames = FALSE, filter="top", options = list(pageLength = 5, scrollX=T) )
# We delete other bars only preserve the gender bar plot

bar1<- ggplot(SAB, aes(x= Gender))+
  geom_bar(fill="skyblue")+
  labs(title ="Gender Distribution")

bar1

bar4<- ggplot(SAB, aes(x= social.medai...video))+
  geom_bar(fill="skyblue")+
  theme(axis.text.x= element_text(angle = 45, hjust = 1))


bar5<- ggplot(SAB, aes(x= Travelling.Time))+
  geom_bar(fill="skyblue")+
  theme(axis.text.x= element_text(angle = 45, hjust = 1))

bar4+bar5
#we add percentage point here

SAB %>%
  count(Department, Gender) %>%
  group_by(Department) %>%
  mutate(perc = n / sum(n) * 100) %>%
  ggplot(aes(x = Department, y = n, fill = Gender, label = sprintf("%.1f%%", perc))) +
  geom_bar(stat = "identity", position = "dodge") +
  geom_text(position = position_dodge(width = 0.9), vjust = -0.25, size = 3) + 
  labs(title = "Department vs Gender", x = "Department", y = "Count") +
  theme_minimal() +
  theme(axis.text.x = element_text(angle = 45, hjust = 1))
# We recreate the bar plot by changing x and y

ggplot(SAB, aes(x = Gender, fill = Certification.Course)) +
  geom_bar(position = "dodge") +
  labs(title = "Certification.Course vs Gender", x = "Count", y = "Certification.Course") +
  theme_minimal()
#we add percentage point here

stress_gender <- SAB %>%
  group_by(Stress.Level, Gender) %>%
  summarise(count = n(), .groups = 'drop') %>%
  group_by(Gender) %>%
  mutate(percentage = (count / sum(count)) * 100)

ggplot(stress_gender, aes(x = Gender, y = count, fill = Stress.Level)) +
  geom_bar(stat = "identity", position = "dodge") +
  geom_text(aes(label = sprintf("%.1f%%", percentage)), 
            position = position_dodge(width = 0.9), vjust = -0.5, size = 2.5) + 
  labs(title = "Gender vs Stress", x = "Gender", y = "Count") +
  theme_minimal()
# We add the daily.studing.time bar here

hobby_studytime<- SAB%>% 
  group_by(hobbies, daily.studing.time) %>% 
  summarise(count = n())

study1<- ggplot(hobby_studytime, aes(x = hobbies, y = count, fill = daily.studing.time)) +
  geom_bar(stat = "identity", position = "dodge") +
  labs(title = "hobby v.s. studytime", x = "hobbies", y = "Count") +
  theme_minimal()+
  theme(axis.text.x= element_text(angle = 45, hjust = 1))

study2<-ggplot(SAB, aes(x=daily.studing.time ))+
  geom_bar(fill= "skyblue")+
  theme(axis.text.x= element_text(angle = 45, hjust = 1))

study1+study2
SAB2 <- SAB
SAB2$Gender <- as.numeric(as.factor(SAB2$Gender))
numeric_data <- SAB2[, sapply(SAB2, is.numeric)]
cor_matrix <- cor(numeric_data, use = "complete.obs")
corrplot(cor_matrix, method = "color", type = "upper", order = "hclust",
         tl.col = "black", tl.srt = 45, 
         addCoef.col = "black")
SAB$daily.studing.time <- factor(SAB$daily.studing.time, 
                                      levels = c("0 - 30 minute", "30 - 60 minute", 
                                                 "1 - 2 Hour", "2 - 3 hour", 
                                                 "3 - 4 hour", "More Than 4 hour"))
ggplot(SAB, aes(x = daily.studing.time, y = college.mark, fill=daily.studing.time)) +
  geom_boxplot() +
  labs(title = "College Marks by Daily Studying Time", x = "Daily Studying Time", y = "College Marks")
lm_studytime <- lm(college.mark ~ daily.studing.time, SAB)
summary(lm_studytime)
SAB$Financial.Status <- as.factor(SAB$Financial.Status)
SAB$Stress.Level <- as.factor(SAB$Stress.Level)
SAB$college.mark <- as.numeric(SAB$college.mark)
ggplot(SAB, aes(x = Financial.Status, y = college.mark, fill = Financial.Status)) +
  geom_boxplot() +
  labs(title = "College Marks by Financial Status", x = "Financial Status", y = "College Marks")
SAB$Financial.Status <- factor(SAB$Financial.Status)
lm_financial <- lm(college.mark ~ Financial.Status , SAB)
summary(lm_financial)
stress_financial<- SAB%>% 
  group_by(Stress.Level, Financial.Status) %>% 
  summarise(count = n())

ggplot(stress_financial, aes(x = Financial.Status, y = count, fill = Stress.Level)) +
  geom_bar(stat = "identity", position = "dodge") +
  labs(title = "Financial vs Stress", x = "Financial", y = "Count") +
  theme_minimal()
SAB$Financial.Status <- as.factor(SAB$Financial.Status)
SAB$Stress.Level <- as.factor(SAB$Stress.Level)
lm_stress_finance <- lm(college.mark ~Stress.Level, SAB)
summary(lm_stress_finance)
SAB$Financial.Status <- as.factor(SAB$Financial.Status)
SAB$Stress.Level <- as.factor(SAB$Stress.Level)
lm_stress_finance <- lm(college.mark ~ Financial.Status + Stress.Level, SAB)
summary(lm_stress_finance)
lm_stress_finance_gender <- lm(college.mark ~ Financial.Status + Stress.Level+ Gender, SAB)
summary(lm_stress_finance_gender)
plota <- ggplot(SAB, aes(x = X12th.Mark, y = college.mark, color = Gender, shape= Gender)) +
  geom_jitter(alpha = 1/2, size = 1)+ 
  geom_smooth(method = "lm", se = FALSE)+
  labs(title = "12th grade vs. college.mark among Gender")

ggplotly(plota)

plotb <- ggplot(SAB, aes(x = X10th.Mark, y = college.mark, color = Gender, shape= Gender)) +
  geom_jitter(alpha = 1/2, size = 1)+ 
  geom_smooth(method = "lm", se = FALSE)+
  labs(title = "10th grade vs. college.mark among Gender")
ggplotly(plotb)

gradeplot1<- ggplot(SAB, aes(x=X10th.Mark, y=college.mark))+
  geom_point(color="#a6bddb")+
  geom_smooth(method= "lm")+
  labs(title = "10th grade vs. college.mark")

gradeplot2<- ggplot(SAB, aes(x=X12th.Mark, y=college.mark))+
  geom_point(color="#a6bddb")+
  geom_smooth(method= "lm")+
  labs(title = "10th grade vs. college.mark")

gradeplot1+gradeplot2
lm_score<- lm(college.mark~ X10th.Mark+ X12th.Mark+ Gender, SAB)
tidy(lm_score, conf.int = T)
lm_score11<- lm(college.mark~ X10th.Mark+ X12th.Mark+ part.time.job, SAB)
tidy(lm_score11, conf.int = T)
lm_score2<- lm(college.mark~ X10th.Mark+X12th.Mark, SAB)
tidy(lm_score2, conf.int = T)
aout <- augment(lm_score2)
ggplot(data = aout, mapping = aes(x = .fitted, y = .resid)) +
  geom_point() +
  geom_hline(yintercept = 0)+
  geom_smooth()
ggplot(data = aout, mapping = aes(sample = .resid)) +
  geom_qq() +
  geom_qq_line(color="blue")
range(SAB$X10th.Mark)
range(SAB$X12th.Mark)
df1 <- data.frame(X10th.Mark = c(70, 80), X12th.Mark= c(34, 87))
predict(lm_score2, newdata = df1, interval = "confidence")
SAB_degree<-SAB%>%
  group_by(degree_prefer)%>%
  count()%>%
  mutate(frequency = n / 235)

SAB_degree2<-SAB%>%
  group_by(degree_prefer, Department)%>%
  count()%>%
  mutate(frequency = n / 235)

SAB_degree
SAB_degree2
t.test(SAB$salary.expectation ~ SAB$Certification.Course)
SAB%>%
  group_by(Gender , Certification.Course) %>%
  summarise(MeanSalary = mean(salary.expectation))
LS0tCnRpdGxlOiAiQW5hbHlzaXMgb2YgQmVoYXZpb3IgYW5kIEF0dGl0dWRlcyBvZiBDb2xsZWdlIFN0dWRlbnRzIgphdXRob3I6ICJZZW4gSm8gKFNhbGx5KSBMZWUsIFlpLVR1bmcgKE1pY2hlbGxlKSBMZWUiCmRhdGU6ICJgciBTeXMuRGF0ZSgpYCIKb3V0cHV0OgogIGh0bWxfZG9jdW1lbnQ6CiAgICBjb2RlX2ZvbGRpbmc6IGhpZGUKICAgIG51bWJlcl9zZWN0aW9uczogdHJ1ZQogICAgdG9jOiB0cnVlCiAgICB0b2NfZGVwdGg6IDQKICAgIHRvY19mbG9hdDogdHJ1ZQogICAgY29kZV9kb3dubG9hZDogdHJ1ZQotLS0KCmBgYHtyIHNldHVwLCBpbmNsdWRlPUZBTFNFfQprbml0cjo6b3B0c19jaHVuayRzZXQoZWNobyA9IFRSVUUpCmxpYnJhcnkodGlkeXZlcnNlKQpsaWJyYXJ5KGdncGxvdDIpCmxpYnJhcnkoZHBseXIpCmxpYnJhcnkoR0dhbGx5KQpsaWJyYXJ5KGJyb29tKQpsaWJyYXJ5KGdyaWRFeHRyYSkKbGlicmFyeShEVCkKbGlicmFyeShwYXRjaHdvcmspCmxpYnJhcnkoZ2d0aGVtZXMpCmxpYnJhcnkocGxvdGx5KQpsaWJyYXJ5KGdhcG1pbmRlcikKbGlicmFyeShjb3JycGxvdCkKbGlicmFyeShjYXIpCmBgYAoKKioqCiMgRGF0YXNldCBvdmVydmlldy4gIHsudGFic2V0fQoKCiMjIFRhYiAxCgojIyMgRGVzY3JpcHRpb24gb2YgdGhlIERhdGFzZXQKCkltcG9ydCwgZXhwbGFpbiB0aGUgdmFyaWFibGVzLCBhbmQgY2l0ZSB0aGUgc291cmNlKHMpCmBgYHtyfQpTdHVkZW50X0F0dGl0dWRlX2FuZF9CZWhhdmlvciA8LSByZWFkLmNzdigifi9EQVRBNjEyL3Byb2plY3QvU3R1ZGVudCBBdHRpdHVkZSBhbmQgQmVoYXZpb3IuY3N2IikKY2F0KCIgVGhlcmUgYXJlIiwgbnJvdyhTdHVkZW50X0F0dGl0dWRlX2FuZF9CZWhhdmlvciksICJyb3dzLCBhbmQiLCBuY29sKFN0dWRlbnRfQXR0aXR1ZGVfYW5kX0JlaGF2aW9yKSwiY29sdW1ucyBpbiB0aGUgU3R1ZGVudF9BdHRpdHVkZV9hbmRfQmVoYXZpb3IgZGF0YS4iICkKYGBgCgoKKiBbU3R1ZGVudCBBdHRpdHVkZSBhbmQgQmVoYXZpb3JdKCJodHRwczovL3d3dy5rYWdnbGUuY29tL2RhdGFzZXRzL3N1c2FudGEyMS9zdHVkZW50LWF0dGl0dWRlLWFuZC1iZWhhdmlvci9kYXRhIikgVGhlIGRhdGEgZnJvbSB0aGUga2FnZ2xlIHdlYnNpdGUsIHdoaWNoIGNvbGxlY3RzIHZhcmlvdXMgaW5mb3JtYXRpb24gYWJvdXQgY29sbGVnZSBzdHVkZW50cyB0aHJvdWdoIEdvb2dsZSBGb3JtcyB0byBhbmFseXplIHN0dWRlbnQgYmVoYXZpb3IgYW5kIGF0dGl0dWRlcy4gVGhpcyBkYXRhIGhhcyBhIHRvdGFsIG9mIDE5IHZhcmlhYmxlcywgd2hpY2ggaW5jbHVkZXMgY2VydGlmaWNhdGlvbiBjb3Vyc2VzLCBnZW5kZXIsIGRlcGFydG1lbnQsIGhlaWdodCAoaW4gY20pLCB3ZWlnaHQgKGluIGtnKSwgbWFya3MgaW4gMTB0aCBhbmQgMTJ0aCBncmFkZSwgY29sbGVnZSBtYXJrcywgaG9iYmllcywgZGFpbHkgc3R1ZHlpbmcgdGltZSwgcHJlZmVycmVkIHN0dWR5IGVudmlyb25tZW50LCBzYWxhcnkgZXhwZWN0YXRpb25zLCBzYXRpc2ZhY3Rpb24gd2l0aCB0aGVpciBkZWdyZWUgYW5kIG90aGVyIGRldGFpbGVkIGluZm9ybWF0aW9uLiBXZSB3aWxsIHByZXNlbnQgZ3JhcGhpY2FsIGFuYWx5c2lzIGFzIHdlbGwgYXMgcmVncmVzc2lvbiBhbmFseXNpcyBmb3IgdGhlc2UgdmFyaWFibGVzLgoKCgpgYGB7cn0KbmFtZTEgPSBjb2xuYW1lcyhTdHVkZW50X0F0dGl0dWRlX2FuZF9CZWhhdmlvcilbMV0KbmFtZTIgPSBjb2xuYW1lcyhTdHVkZW50X0F0dGl0dWRlX2FuZF9CZWhhdmlvcilbMl0KbmFtZXMoU3R1ZGVudF9BdHRpdHVkZV9hbmRfQmVoYXZpb3IpCmBgYAoKCgojIyBUYWIgMgoKIyMjIENsZWFuIGFuZCB0aWR5IGRhdGEKCmBgYHtyfQppc190aWJibGUoU3R1ZGVudF9BdHRpdHVkZV9hbmRfQmVoYXZpb3IpCgphc190aWJibGUoU3R1ZGVudF9BdHRpdHVkZV9hbmRfQmVoYXZpb3IpIC0+IFNBQgoKaXNfdGliYmxlKFNBQikKCmdsaW1wc2UoU0FCKQoKc3VtKGlzLm5hKFNBQikpCgpzdW1tYXJ5KFNBQikKYGBgCgpXZSBjaGFuZ2UgdmFyaWFibGVzIG5hbWUgaGVyZS4KYGBge3J9ClNBQiA8LSBTQUIgJT4lCiAgcmVuYW1lKGRlZ3JlZV9wcmVmZXIgPURvLnlvdS5saWtlLnlvdXIuZGVncmVlLikgJT4lCiAgcmVuYW1lKGNhcmVlcl93aWxsaW5nbmVzcyA9IHdpbGxpbmduZXNzLnRvLnB1cnN1ZS5hLmNhcmVlci5iYXNlZC5vbi50aGVpci5kZWdyZWUpJT4lCiAgbXV0YXRlKERlcGFydG1lbnQgPSBnc3ViKCJCLmNvbSBJU00iLCAiSVNNIiwgRGVwYXJ0bWVudCkpJT4lCiAgbXV0YXRlKERlcGFydG1lbnQgPSBnc3ViKCJCLmNvbSBBY2NvdW50aW5nIGFuZCBGaW5hbmNlICIsICJBY2NvdW50aW5nIGFuZCBGaW5hbmNlIiwgRGVwYXJ0bWVudCkpCiAgICAgICAgIApgYGAKCgojIyBUYWIgMwoKIyMjIEFuIGludGVyYWN0aXZlIHRhYmxlCmBgYHtyIHRhYi10YWIzLCBtZXNzYWdlcz1GQUxTRSwgd2FybmluZz0gRkFMU0V9CiN8IGNvbGxhcHNlID0gVFJVRQoKZGF0YXRhYmxlKFNBQiwgcm93bmFtZXMgPSBGQUxTRSwgZmlsdGVyPSJ0b3AiLCBvcHRpb25zID0gbGlzdChwYWdlTGVuZ3RoID0gNSwgc2Nyb2xsWD1UKSApCmBgYAoKCgoqKioKIyBHcmFwaHMgZm9yIHRoZSBEYXRhc2V0CgoKIyMgUXVhbGl0YXRpdmUgVmFyaWFibGUKCkJhc2VkIG9uIHRoZSBkYXRhc2V0LCB3ZSBjYW4gc2VlIHRoYXQgbWFsZXMgb3V0bnVtYmVyIGZlbWFsZXMuIEFsc28sIHdlIGFyZSBpbnRlcmVzdGVkIGluIHRoZSBkaXN0cmlidXRpb24gb2YgZ2VuZGVyIGFjcm9zcyBvdGhlciB2YXJpYWJsZXMuCmBgYHtyfQojIFdlIGRlbGV0ZSBvdGhlciBiYXJzIG9ubHkgcHJlc2VydmUgdGhlIGdlbmRlciBiYXIgcGxvdAoKYmFyMTwtIGdncGxvdChTQUIsIGFlcyh4PSBHZW5kZXIpKSsKICBnZW9tX2JhcihmaWxsPSJza3libHVlIikrCiAgbGFicyh0aXRsZSA9IkdlbmRlciBEaXN0cmlidXRpb24iKQoKYmFyMQpgYGAKCgpCZWxvdyBpcyB0aGUgZGlzdHJpYnV0aW9uIG9mIHN0dWRlbnRzJyB0aW1lIHNwZW50IG9uIHNvY2lhbCBtZWRpYSBhbmQgdHJhdmVsbGluZyB0aW1lLgpgYGB7cn0KCmJhcjQ8LSBnZ3Bsb3QoU0FCLCBhZXMoeD0gc29jaWFsLm1lZGFpLi4udmlkZW8pKSsKICBnZW9tX2JhcihmaWxsPSJza3libHVlIikrCiAgdGhlbWUoYXhpcy50ZXh0Lng9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDQ1LCBoanVzdCA9IDEpKQoKCmJhcjU8LSBnZ3Bsb3QoU0FCLCBhZXMoeD0gVHJhdmVsbGluZy5UaW1lKSkrCiAgZ2VvbV9iYXIoZmlsbD0ic2t5Ymx1ZSIpKwogIHRoZW1lKGF4aXMudGV4dC54PSBlbGVtZW50X3RleHQoYW5nbGUgPSA0NSwgaGp1c3QgPSAxKSkKCmJhcjQrYmFyNQpgYGAKCldlIGNyZWF0ZSBzb21lIHBsb3QgdGhhdCBjb21wYXJlcyBnZW5kZXIgYWNyb3NzIGRlcGFydG1lbnRzIGFuZCBjZXJ0aWZpY2F0aW9uIGxldmVscy4KYGBge3J9CiN3ZSBhZGQgcGVyY2VudGFnZSBwb2ludCBoZXJlCgpTQUIgJT4lCiAgY291bnQoRGVwYXJ0bWVudCwgR2VuZGVyKSAlPiUKICBncm91cF9ieShEZXBhcnRtZW50KSAlPiUKICBtdXRhdGUocGVyYyA9IG4gLyBzdW0obikgKiAxMDApICU+JQogIGdncGxvdChhZXMoeCA9IERlcGFydG1lbnQsIHkgPSBuLCBmaWxsID0gR2VuZGVyLCBsYWJlbCA9IHNwcmludGYoIiUuMWYlJSIsIHBlcmMpKSkgKwogIGdlb21fYmFyKHN0YXQgPSAiaWRlbnRpdHkiLCBwb3NpdGlvbiA9ICJkb2RnZSIpICsKICBnZW9tX3RleHQocG9zaXRpb24gPSBwb3NpdGlvbl9kb2RnZSh3aWR0aCA9IDAuOSksIHZqdXN0ID0gLTAuMjUsIHNpemUgPSAzKSArIAogIGxhYnModGl0bGUgPSAiRGVwYXJ0bWVudCB2cyBHZW5kZXIiLCB4ID0gIkRlcGFydG1lbnQiLCB5ID0gIkNvdW50IikgKwogIHRoZW1lX21pbmltYWwoKSArCiAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA0NSwgaGp1c3QgPSAxKSkKYGBgCgoKQmFzZWQgb24gdGhlIGRpc3RyaWJ1dGlvbiwgd2UgZm91bmQgdGhhdCBtb3N0IG9mIHRoZSBzdHVkZW50cyBjb21wbGV0ZWQgY2VydGlmaWNhdGlvbiBjb3Vyc2UuCmBgYHtyfQojIFdlIHJlY3JlYXRlIHRoZSBiYXIgcGxvdCBieSBjaGFuZ2luZyB4IGFuZCB5CgpnZ3Bsb3QoU0FCLCBhZXMoeCA9IEdlbmRlciwgZmlsbCA9IENlcnRpZmljYXRpb24uQ291cnNlKSkgKwogIGdlb21fYmFyKHBvc2l0aW9uID0gImRvZGdlIikgKwogIGxhYnModGl0bGUgPSAiQ2VydGlmaWNhdGlvbi5Db3Vyc2UgdnMgR2VuZGVyIiwgeCA9ICJDb3VudCIsIHkgPSAiQ2VydGlmaWNhdGlvbi5Db3Vyc2UiKSArCiAgdGhlbWVfbWluaW1hbCgpCmBgYAoKCkhlcmUgaXMgdGhlIHN0cmVzcyBsZXZlbCBhbW9uZyBnZW5kZXIsIG1vc3Qgb2YgdGhlIHN0dWRlbnRzIGFyZSBpbiBnb29kIHN0YXR1cy4KYGBge3IgbWVzc2FnZXM9RkFMU0UsIHdhcm5pbmc9IEZBTFNFfQojd2UgYWRkIHBlcmNlbnRhZ2UgcG9pbnQgaGVyZQoKc3RyZXNzX2dlbmRlciA8LSBTQUIgJT4lCiAgZ3JvdXBfYnkoU3RyZXNzLkxldmVsLCBHZW5kZXIpICU+JQogIHN1bW1hcmlzZShjb3VudCA9IG4oKSwgLmdyb3VwcyA9ICdkcm9wJykgJT4lCiAgZ3JvdXBfYnkoR2VuZGVyKSAlPiUKICBtdXRhdGUocGVyY2VudGFnZSA9IChjb3VudCAvIHN1bShjb3VudCkpICogMTAwKQoKZ2dwbG90KHN0cmVzc19nZW5kZXIsIGFlcyh4ID0gR2VuZGVyLCB5ID0gY291bnQsIGZpbGwgPSBTdHJlc3MuTGV2ZWwpKSArCiAgZ2VvbV9iYXIoc3RhdCA9ICJpZGVudGl0eSIsIHBvc2l0aW9uID0gImRvZGdlIikgKwogIGdlb21fdGV4dChhZXMobGFiZWwgPSBzcHJpbnRmKCIlLjFmJSUiLCBwZXJjZW50YWdlKSksIAogICAgICAgICAgICBwb3NpdGlvbiA9IHBvc2l0aW9uX2RvZGdlKHdpZHRoID0gMC45KSwgdmp1c3QgPSAtMC41LCBzaXplID0gMi41KSArIAogIGxhYnModGl0bGUgPSAiR2VuZGVyIHZzIFN0cmVzcyIsIHggPSAiR2VuZGVyIiwgeSA9ICJDb3VudCIpICsKICB0aGVtZV9taW5pbWFsKCkKYGBgCgoKSGVyZSBpcyB0aGUgYnJlYWtkb3duIG9mIGhvYmJpZXMgYW5kIHN0dWR5IHRpbWUuIE1vc3Qgb2YgdGhlbSBzdHVkeSBmb3IgMzAgdG8gNjAgbWludXRlcy4gV2UgZGlzY292ZXJlZCB0aGF0IHN0dWRlbnRzIHdobyBwbGF5IHZpZGVvIGdhbWVzIGNhbm5vdCBzdHVkeSBmb3IgbW9yZSB0aGFuIGZvdXIgaG91cnMuCmBgYHtyIG1lc3NhZ2VzPUZBTFNFLCB3YXJuaW5nPSBGQUxTRX0KIyBXZSBhZGQgdGhlIGRhaWx5LnN0dWRpbmcudGltZSBiYXIgaGVyZQoKaG9iYnlfc3R1ZHl0aW1lPC0gU0FCJT4lIAogIGdyb3VwX2J5KGhvYmJpZXMsIGRhaWx5LnN0dWRpbmcudGltZSkgJT4lIAogIHN1bW1hcmlzZShjb3VudCA9IG4oKSkKCnN0dWR5MTwtIGdncGxvdChob2JieV9zdHVkeXRpbWUsIGFlcyh4ID0gaG9iYmllcywgeSA9IGNvdW50LCBmaWxsID0gZGFpbHkuc3R1ZGluZy50aW1lKSkgKwogIGdlb21fYmFyKHN0YXQgPSAiaWRlbnRpdHkiLCBwb3NpdGlvbiA9ICJkb2RnZSIpICsKICBsYWJzKHRpdGxlID0gImhvYmJ5IHYucy4gc3R1ZHl0aW1lIiwgeCA9ICJob2JiaWVzIiwgeSA9ICJDb3VudCIpICsKICB0aGVtZV9taW5pbWFsKCkrCiAgdGhlbWUoYXhpcy50ZXh0Lng9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDQ1LCBoanVzdCA9IDEpKQoKc3R1ZHkyPC1nZ3Bsb3QoU0FCLCBhZXMoeD1kYWlseS5zdHVkaW5nLnRpbWUgKSkrCiAgZ2VvbV9iYXIoZmlsbD0gInNreWJsdWUiKSsKICB0aGVtZShheGlzLnRleHQueD0gZWxlbWVudF90ZXh0KGFuZ2xlID0gNDUsIGhqdXN0ID0gMSkpCgpzdHVkeTErc3R1ZHkyCmBgYAoKCgoqKioKIyBDb3JyZWxhdGlvbiBNYXAKCmBgYHtyfQpTQUIyIDwtIFNBQgpTQUIyJEdlbmRlciA8LSBhcy5udW1lcmljKGFzLmZhY3RvcihTQUIyJEdlbmRlcikpCm51bWVyaWNfZGF0YSA8LSBTQUIyWywgc2FwcGx5KFNBQjIsIGlzLm51bWVyaWMpXQpjb3JfbWF0cml4IDwtIGNvcihudW1lcmljX2RhdGEsIHVzZSA9ICJjb21wbGV0ZS5vYnMiKQpjb3JycGxvdChjb3JfbWF0cml4LCBtZXRob2QgPSAiY29sb3IiLCB0eXBlID0gInVwcGVyIiwgb3JkZXIgPSAiaGNsdXN0IiwKICAgICAgICAgdGwuY29sID0gImJsYWNrIiwgdGwuc3J0ID0gNDUsIAogICAgICAgICBhZGRDb2VmLmNvbCA9ICJibGFjayIpCmBgYAoKCiMjIyMgVGhpcyBjb3JyZWxhdGlvbiBwbG90IHByb3ZpZGVzIHRoZSBjb3JyZWxhdGlvbiBjb2VmZmljaWVudHMgYmV0d2VlbiBkaWZmZXJlbnQgcGFpcnMgb2YgdmFyaWFibGVzLCB3aGljaCBxdWFudGlmeSB0aGUgc3RyZW5ndGggYW5kIGRpcmVjdGlvbiBvZiB0aGUgbGluZWFyIHJlbGF0aW9uc2hpcCBiZXR3ZWVuIHRoZW0uIAoKCi0gKipjb2xsZWdlLm1hcmsgYW5kIFgxMHRoLk1hcmsgKDAuNDcpKio6IFRoZXJlJ3MgYSBtb2RlcmF0ZSBwb3NpdGl2ZSBjb3JyZWxhdGlvbiBiZXR3ZWVuIG1hcmtzIGluIHRoZSAxMHRoIGdyYWRlIGFuZCBjb2xsZWdlLCBzdWdnZXN0aW5nIHRoYXQgaGlnaGVyIG1hcmtzIGluIHRoZSAxMHRoIGdyYWRlIGFyZSBhc3NvY2lhdGVkIHdpdGggaGlnaGVyIGNvbGxlZ2UgbWFya3MuCgotICoqY29sbGVnZS5tYXJrIGFuZCBYMTJ0aC5NYXJrICgwLjQyKSoqOiBUaGlzIGluZGljYXRlcyBhIG1vZGVyYXRlIHBvc2l0aXZlIGNvcnJlbGF0aW9uIGJldHdlZW4gMTJ0aC1ncmFkZSBtYXJrcyBhbmQgY29sbGVnZSBtYXJrcy4KCi0gKipjb2xsZWdlLm1hcmsgYW5kIG90aGVyIHZhcmlhYmxlcyoqOiBUaGUgY29ycmVsYXRpb24gY29lZmZpY2llbnRzIHdpdGggb3RoZXIgdmFyaWFibGVzIGxpa2Ugc2FsYXJ5IGV4cGVjdGF0aW9uLCBoZWlnaHQsIGdlbmRlciwgYW5kIHdlaWdodCBhcmUgY2xvc2UgdG8gemVybywgaW5kaWNhdGluZyBhIHZlcnkgd2VhayB0byBubyBsaW5lYXIgcmVsYXRpb25zaGlwIHdpdGggY29sbGVnZSBtYXJrcy4KCi0gKipYMTB0aC5NYXJrIGFuZCBYMTJ0aC5NYXJrICgwLjQ3KSoqOiBUaGlzIHNob3dzIGEgbW9kZXJhdGUgcG9zaXRpdmUgY29ycmVsYXRpb24sIGluZGljYXRpbmcgdGhhdCBzdHVkZW50cyB3aG8gcGVyZm9ybSB3ZWxsIGluIHRoZSAxMHRoIGdyYWRlIGFsc28gdGVuZCB0byBwZXJmb3JtIHdlbGwgaW4gdGhlIDEydGggZ3JhZGUuCgotICoqSGVpZ2h0LkNNLiBhbmQgV2VpZ2h0LktHLiAoMC4yOCkqKjogQSBwb3NpdGl2ZSBjb3JyZWxhdGlvbiBoZXJlIHN1Z2dlc3RzIHRoYXQgYXMgaGVpZ2h0IGluY3JlYXNlcywgd2VpZ2h0IGFsc28gdGVuZHMgdG8gaW5jcmVhc2UsIHdoaWNoIGlzIGEgY29tbW9uIHBoeXNpb2xvZ2ljYWwgY29ycmVsYXRpb24uCgotICoqR2VuZGVyIGFuZCBXZWlnaHQuS0cuICgwLjQ5KSoqOiBUaGlzIHN1Z2dlc3RzIGEgbW9kZXJhdGUgcG9zaXRpdmUgY29ycmVsYXRpb24sIHdoaWNoIG1pZ2h0IGluZGljYXRlIHRoYXQgb25lIGdlbmRlciAoY29kZWQgbnVtZXJpY2FsbHkpIHRlbmRzIHRvIHdlaWdoIG1vcmUgb24gYXZlcmFnZS4KCi0gKipPdGhlciBDb3JyZWxhdGlvbnMqKjogQ29ycmVsYXRpb25zIGludm9sdmluZyBzYWxhcnkgZXhwZWN0YXRpb24sIGhlaWdodCwgYW5kIGdlbmRlciB3aXRoIDEwdGggYW5kIDEydGgtZ3JhZGUgbWFya3MgYXJlIHdlYWssIGFzIGluZGljYXRlZCBieSBjb2VmZmljaWVudHMgY2xvc2VyIHRvIHplcm8uCgoKKioqCiMgSW5mbHVlbmNlIG9mIFN0dWR5IEhhYml0cyBvbiBBY2FkZW1pYyBTdWNjZXNzCgoKIyMgSXMgdGhlcmUgYSByZWxhdGlvbnNoaXAgYmV0d2VlbiBkYWlseSBzdHVkeWluZyB0aW1lIGFuZCBjb2xsZWdlIG1hcmtzPwoKCmBgYHtyfQpTQUIkZGFpbHkuc3R1ZGluZy50aW1lIDwtIGZhY3RvcihTQUIkZGFpbHkuc3R1ZGluZy50aW1lLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXZlbHMgPSBjKCIwIC0gMzAgbWludXRlIiwgIjMwIC0gNjAgbWludXRlIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiMSAtIDIgSG91ciIsICIyIC0gMyBob3VyIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiMyAtIDQgaG91ciIsICJNb3JlIFRoYW4gNCBob3VyIikpCmdncGxvdChTQUIsIGFlcyh4ID0gZGFpbHkuc3R1ZGluZy50aW1lLCB5ID0gY29sbGVnZS5tYXJrLCBmaWxsPWRhaWx5LnN0dWRpbmcudGltZSkpICsKICBnZW9tX2JveHBsb3QoKSArCiAgbGFicyh0aXRsZSA9ICJDb2xsZWdlIE1hcmtzIGJ5IERhaWx5IFN0dWR5aW5nIFRpbWUiLCB4ID0gIkRhaWx5IFN0dWR5aW5nIFRpbWUiLCB5ID0gIkNvbGxlZ2UgTWFya3MiKQpgYGAKCgojIyMgVGhpcyBib3hwbG90IGlsbHVzdHJhdGVzIHRoZSBkaXN0cmlidXRpb24gb2YgY29sbGVnZSBtYXJrcyBhY3Jvc3MgZGlmZmVyZW50IGNhdGVnb3JpZXMgb2YgZGFpbHkgc3R1ZHlpbmcgdGltZS4KCigxKSBTdHVkZW50cyB3aG8gc3R1ZGllZCBmb3IgMCB0byAzMCBtaW51dGVzIGEgZGF5IGFuZCB0aG9zZSB3aG8gc3R1ZGllZCBmb3IgMzAgdG8gNjAgbWludXRlcyBzZWVtZWQgdG8gcGVyZm9ybSBzaW1pbGFybHkuCgooMikgVGhlIDEgLSAyIGhvdXIgYm94ZXMgYXJlIHRhbGxlciBpbiBjb21wYXJpc29uLCBpbmRpY2F0aW5nIGEgZ3JlYXRlciBkaWZmZXJlbmNlIGluIHNjb3JlcyBmb3IgdGhlc2Ugc3R1ZGVudHMuCgooMykgVGhlIDMgLSA0IGhvdXIgOiBTdHVkZW50cyBpbiB0aGlzIGNhdGVnb3J5IGhhdmUgYSBzbGlnaHRseSBoaWdoZXIgbWVkaWFuIG1hcmsgdGhhbiB0aGUgcHJldmlvdXMgZ3JvdXBzLgoKKDQpIE1vcmUgdGhhbiA0IGhvdXIgOiBUaGUgbWVkaWFuIG51bWJlciBvZiBzdHVkZW50cyB3aG8gc3R1ZHkgZm9yIG1vcmUgdGhhbiA0IGhvdXJzIGlzIHJlbGF0aXZlbHkgbG93LiBJdCBjYW4gYmUgc2VlbiB0aGF0IHRoZSBtb3JlIHRpbWUgdGhleSBzdHVkeSwgdGhlIHNjb3JlIHBlcmZvcm1hbmNlIG9mIHN0dWRlbnRzIHdpbGwgbm90IG5lY2Vzc2FyaWx5IGluY3JlYXNlLgoKKipUaGlzIGluZGljYXRlIHRoYXQgcXVhbGl0eSwgcmF0aGVyIHRoYW4gcXVhbnRpdHksIG9mIHN0dWR5IHRpbWUgaXMgY3J1Y2lhbC4qKgoKYGBge3J9CmxtX3N0dWR5dGltZSA8LSBsbShjb2xsZWdlLm1hcmsgfiBkYWlseS5zdHVkaW5nLnRpbWUsIFNBQikKc3VtbWFyeShsbV9zdHVkeXRpbWUpCmBgYAooMSkgVGhlIG1lZGlhbiBvZiB0aGUgcmVzaWR1YWxzIGlzIDEuMzEsIHdoaWNoIGlzIGNsb3NlIHRvIDAsIHN1Z2dlc3RpbmcgdGhhdCwgb24gYXZlcmFnZSwgdGhlIG1vZGVsIGRvZXNuJ3Qgc3lzdGVtYXRpY2FsbHkgb3Zlci0gb3IgdW5kZXItcHJlZGljdC4KCigyKSBUaGUgcCB2YWx1ZXMgYXNzb2NpYXRlZCB3aXRoIHRoZXNlIGNvZWZmaWNpZW50cyBhcmUgYWxsIGFib3ZlIDAuMDUsIGluZGljYXRpbmcgdGhhdCBuZWl0aGVyIGluY3JlYXNlcyBub3IgZGVjcmVhc2VzIGluIHN0dWR5IHRpbWUgYXJlIHN0YXRpc3RpY2FsbHkgc2lnbmlmaWNhbnQgcHJlZGljdG9ycyBvZiBjb2xsZWdlIHBlcmZvcm1hbmNlLgoKSW4gc3VtbWFyeSwgdGhlIGxpbmVhciBtb2RlbCBpbmRpY2F0ZXMgdGhhdCB0aGVyZSBpcyBubyBzdHJvbmcgZXZpZGVuY2Ugb2YgYSByZWxhdGlvbnNoaXAgYmV0d2VlbiBgY29sbGVnZS5tYXJrYCBhbmQgYGRhaWx5LnN0dWRpbmcudGltZWAsIGdpdmVuIHRoZSBsYWNrIG9mIHN0YXRpc3RpY2FsIHNpZ25pZmljYW5jZSBmb3IgdGhlIGNvZWZmaWNpZW50cyBhbmQgdGhlIGxvdyBSLXNxdWFyZWQgdmFsdWVzLiBUaGUgbW9zdCBzdWJzdGFudGlhbCBhc3NvY2lhdGlvbiBzZWVuIGlzIHdpdGggdGhlICIyIC0gMyBob3VyIiBzdHVkeSBncm91cCwgd2hpY2ggbWlnaHQgc3VnZ2VzdCBhIHNsaWdodCBpbmNyZWFzZSBpbiBjb2xsZWdlIG1hcmtzLCBidXQgdGhpcyBpcyBub3Qgc3RhdGlzdGljYWxseSBzaWduaWZpY2FudCBhdCB0aGUgNSUgbGV2ZWwuIAoKKioqCiMgU29jaWFsIGFuZCBFY29ub21pYyBGYWN0b3JzIEluZmx1ZW5jaW5nIFN0dWRlbnQgTGlmZQoKCiMjIFBsb3R0aW5nIGNvbGxlZ2UgbWFya3MgYnkgU3RyZXNzLkxldmVsCgpXaGF0IGlzIHRoZSBpbXBhY3Qgb2YgZmluYW5jaWFsIHN0YXR1cyBvbiBzdHVkZW50c+KAmSBzdHJlc3MgbGV2ZWxzIGFuZCBhY2FkZW1pYyBwZXJmb3JtYW5jZT8KCmBgYHtyfQpTQUIkRmluYW5jaWFsLlN0YXR1cyA8LSBhcy5mYWN0b3IoU0FCJEZpbmFuY2lhbC5TdGF0dXMpClNBQiRTdHJlc3MuTGV2ZWwgPC0gYXMuZmFjdG9yKFNBQiRTdHJlc3MuTGV2ZWwpClNBQiRjb2xsZWdlLm1hcmsgPC0gYXMubnVtZXJpYyhTQUIkY29sbGVnZS5tYXJrKQpnZ3Bsb3QoU0FCLCBhZXMoeCA9IEZpbmFuY2lhbC5TdGF0dXMsIHkgPSBjb2xsZWdlLm1hcmssIGZpbGwgPSBGaW5hbmNpYWwuU3RhdHVzKSkgKwogIGdlb21fYm94cGxvdCgpICsKICBsYWJzKHRpdGxlID0gIkNvbGxlZ2UgTWFya3MgYnkgRmluYW5jaWFsIFN0YXR1cyIsIHggPSAiRmluYW5jaWFsIFN0YXR1cyIsIHkgPSAiQ29sbGVnZSBNYXJrcyIpCmBgYAoKClRoZSAiRmFidWxvdXMiIGZpbmFuY2lhbCBzdGF0dXMgZ3JvdXAgaGFzIHRoZSBsb3dlc3QgbWVkaWFuIGNvbGxlZ2UgbWFyay4gVGhlICJBd2Z1bCIgZmluYW5jaWFsIHN0YXR1cyBncm91cCBkb2VzIG5vdCBoYXZlIHRoZSBsb3dlc3QgbWVkaWFuIGNvbGxlZ2UgbWFya3MuCgpUaGlzIGNvdWxkIHN1Z2dlc3QgdGhhdCBmaW5hbmNpYWwgc3RhdHVzIG1heSBub3QgYmUgdGhlIHByaW1hcnkgZGV0ZXJtaW5hbnQgb2YgYWNhZGVtaWMgc3VjY2VzcyBvciB0aGF0IHRoZXJlIGFyZSBvdGhlciBmYWN0b3JzIGF0IHBsYXkuCgojIyMgUmVncmVzc2lvbiBBbmFseXNpcyBmb3IgRmluYW5jaWFsIFN0YXR1cyBhbmQgQ29sbGVnZSBNYXJrcwpgYGB7cn0KU0FCJEZpbmFuY2lhbC5TdGF0dXMgPC0gZmFjdG9yKFNBQiRGaW5hbmNpYWwuU3RhdHVzKQpsbV9maW5hbmNpYWwgPC0gbG0oY29sbGVnZS5tYXJrIH4gRmluYW5jaWFsLlN0YXR1cyAsIFNBQikKc3VtbWFyeShsbV9maW5hbmNpYWwpCmBgYApUaGUgbW9kZWwncyByZXN1bHRzIHN1Z2dlc3QgdGhhdCB0aGVyZSBpcyBubyBzaWduaWZpY2FudCByZWxhdGlvbnNoaXAgYmV0d2VlbiBGaW5hbmNpYWwuU3RhdHVzIGFuZCBjb2xsZWdlLm1hcmsuCgpHaXZlbiB0aGUgbGFjayBvZiBzdGF0aXN0aWNhbCBzaWduaWZpY2FuY2UgYW5kIHRoZSB2ZXJ5IGxvdyBSLXNxdWFyZWQgdmFsdWVzLCBGaW5hbmNpYWwuU3RhdHVzIGFsb25lIGRvZXMgbm90IGFwcGVhciB0byBiZSBhIGdvb2QgcHJlZGljdG9yIG9mIGNvbGxlZ2UubWFyayBpbiB0aGlzIG1vZGVsLiBUaGlzIGltcGxpZXMgdGhhdCB0aGUgaW1wYWN0IG9mIGZpbmFuY2lhbCBzdGF0dXMgb24gYWNhZGVtaWMgcGVyZm9ybWFuY2UgaXMgbm90IGxpbmVhci4gCgoKIyMgUGxvdHRpbmcgY29sbGVnZSBtYXJrcyBieSBTdHJlc3MuTGV2ZWwKYGBge3IgbWVzc2FnZXM9RkFMU0UsIHdhcm5pbmc9IEZBTFNFfQpzdHJlc3NfZmluYW5jaWFsPC0gU0FCJT4lIAogIGdyb3VwX2J5KFN0cmVzcy5MZXZlbCwgRmluYW5jaWFsLlN0YXR1cykgJT4lIAogIHN1bW1hcmlzZShjb3VudCA9IG4oKSkKCmdncGxvdChzdHJlc3NfZmluYW5jaWFsLCBhZXMoeCA9IEZpbmFuY2lhbC5TdGF0dXMsIHkgPSBjb3VudCwgZmlsbCA9IFN0cmVzcy5MZXZlbCkpICsKICBnZW9tX2JhcihzdGF0ID0gImlkZW50aXR5IiwgcG9zaXRpb24gPSAiZG9kZ2UiKSArCiAgbGFicyh0aXRsZSA9ICJGaW5hbmNpYWwgdnMgU3RyZXNzIiwgeCA9ICJGaW5hbmNpYWwiLCB5ID0gIkNvdW50IikgKwogIHRoZW1lX21pbmltYWwoKQpgYGAKCgojIyMgUmVncmVzc2lvbiBBbmFseXNpcyBmb3IgU3RyZXNzIExldmVsIGFuZCBDb2xsZWdlIE1hcmtzCmBgYHtyfQpTQUIkRmluYW5jaWFsLlN0YXR1cyA8LSBhcy5mYWN0b3IoU0FCJEZpbmFuY2lhbC5TdGF0dXMpClNBQiRTdHJlc3MuTGV2ZWwgPC0gYXMuZmFjdG9yKFNBQiRTdHJlc3MuTGV2ZWwpCmxtX3N0cmVzc19maW5hbmNlIDwtIGxtKGNvbGxlZ2UubWFyayB+U3RyZXNzLkxldmVsLCBTQUIpCnN1bW1hcnkobG1fc3RyZXNzX2ZpbmFuY2UpCmBgYApUaGUgcmVzdWx0cyBvZiB0aGlzIG1vZGVsIGFsc28gc2hvdyB0aGF0IHRoZXJlIGlzIG5vIHNpZ25pZmljYW50IHJlbGF0aW9uc2hpcCBiZXR3ZWVuIFN0cmVzcyBMZXZlbCBhbmQgQ29sbGVnZS5tYXJrIGJlY2F1c2UgdGhlIFAtdmFsdWVzIGZvciBkaWZmZXJlbnQgc3RyZXNzIGxldmVscyBhcmUgYWxsIGdyZWF0ZXIgdGhhbiAwLjA1LgoKCgojIyBNdXRpcHVsZSBSZWdyZXNzaW9uIGFuYWx5c2lzIChGaW5hbmNpYWwuU3RhdHVzICsgU3RyZXNzLkxldmVsKQpgYGB7cn0KU0FCJEZpbmFuY2lhbC5TdGF0dXMgPC0gYXMuZmFjdG9yKFNBQiRGaW5hbmNpYWwuU3RhdHVzKQpTQUIkU3RyZXNzLkxldmVsIDwtIGFzLmZhY3RvcihTQUIkU3RyZXNzLkxldmVsKQpsbV9zdHJlc3NfZmluYW5jZSA8LSBsbShjb2xsZWdlLm1hcmsgfiBGaW5hbmNpYWwuU3RhdHVzICsgU3RyZXNzLkxldmVsLCBTQUIpCnN1bW1hcnkobG1fc3RyZXNzX2ZpbmFuY2UpCmBgYAoKClRoZSByZWdyZXNzaW9uIGFuYWx5c2lzIGluZGljYXRlcyB0aGF0IG5laXRoZXIgYEZpbmFuY2lhbC5TdGF0dXNgIG5vciBgU3RyZXNzLkxldmVsYCBhcmUgc2lnbmlmaWNhbnQgcHJlZGljdG9ycyBvZiBgY29sbGVnZS5tYXJrYCBpbiB0aGUgY29udGV4dCBvZiB0aGlzIG1vZGVsLiBUaGUgYWRqdXN0ZWQgUi1zcXVhcmVkIHZhbHVlIGJlaW5nIG5lZ2F0aXZlIGlzIGEgcGFydGljdWxhcmx5IHN0cm9uZyBpbmRpY2F0aW9uIHRoYXQgdGhlIG1vZGVsIGhhcyBubyBwcmVkaWN0aXZlIHBvd2VyLgoKCiMjIyBBZGQgR2VuZGVyIGFzIHByZWRpY3RvcgpgYGB7cn0KbG1fc3RyZXNzX2ZpbmFuY2VfZ2VuZGVyIDwtIGxtKGNvbGxlZ2UubWFyayB+IEZpbmFuY2lhbC5TdGF0dXMgKyBTdHJlc3MuTGV2ZWwrIEdlbmRlciwgU0FCKQpzdW1tYXJ5KGxtX3N0cmVzc19maW5hbmNlX2dlbmRlcikKYGBgCgoKRnJvbSB0aGUgY29lZmZpY2llbnQgZm9yIG1hbGVzIGlzICgtOS4zNzgwKSBhbmQgcCA8IDAuMDUsIHdlIGZpbmQgdGhhdCBnZW5kZXIgYXBwZWFycyB0byBiZSBhbiBpbXBvcnRhbnQgcHJlZGljdG9yIGluIHRoZSBtb2RlbCwgc2hvd2luZyBhIHN0cm9uZyBpbXBhY3Qgb24gY29sbGVnZSBwZXJmb3JtYW5jZSwgd2l0aCBtZW4gZXhwZWN0ZWQgdG8gc2NvcmUgbG93ZXIgdGhhbiB3b21lbi4KCioqKgojIEFjYWRlbWljIHBlcmZvcm1hY2UgYW1vbmcgR2VuZGVyCgpgYGB7cn0KcGxvdGEgPC0gZ2dwbG90KFNBQiwgYWVzKHggPSBYMTJ0aC5NYXJrLCB5ID0gY29sbGVnZS5tYXJrLCBjb2xvciA9IEdlbmRlciwgc2hhcGU9IEdlbmRlcikpICsKICBnZW9tX2ppdHRlcihhbHBoYSA9IDEvMiwgc2l6ZSA9IDEpKyAKICBnZW9tX3Ntb290aChtZXRob2QgPSAibG0iLCBzZSA9IEZBTFNFKSsKICBsYWJzKHRpdGxlID0gIjEydGggZ3JhZGUgdnMuIGNvbGxlZ2UubWFyayBhbW9uZyBHZW5kZXIiKQoKZ2dwbG90bHkocGxvdGEpCgpwbG90YiA8LSBnZ3Bsb3QoU0FCLCBhZXMoeCA9IFgxMHRoLk1hcmssIHkgPSBjb2xsZWdlLm1hcmssIGNvbG9yID0gR2VuZGVyLCBzaGFwZT0gR2VuZGVyKSkgKwogIGdlb21faml0dGVyKGFscGhhID0gMS8yLCBzaXplID0gMSkrIAogIGdlb21fc21vb3RoKG1ldGhvZCA9ICJsbSIsIHNlID0gRkFMU0UpKwogIGxhYnModGl0bGUgPSAiMTB0aCBncmFkZSB2cy4gY29sbGVnZS5tYXJrIGFtb25nIEdlbmRlciIpCmdncGxvdGx5KHBsb3RiKQoKYGBgCgoKCgpgYGB7ciBtZXNzYWdlcz1GQUxTRSwgd2FybmluZz0gRkFMU0V9CmdyYWRlcGxvdDE8LSBnZ3Bsb3QoU0FCLCBhZXMoeD1YMTB0aC5NYXJrLCB5PWNvbGxlZ2UubWFyaykpKwogIGdlb21fcG9pbnQoY29sb3I9IiNhNmJkZGIiKSsKICBnZW9tX3Ntb290aChtZXRob2Q9ICJsbSIpKwogIGxhYnModGl0bGUgPSAiMTB0aCBncmFkZSB2cy4gY29sbGVnZS5tYXJrIikKCmdyYWRlcGxvdDI8LSBnZ3Bsb3QoU0FCLCBhZXMoeD1YMTJ0aC5NYXJrLCB5PWNvbGxlZ2UubWFyaykpKwogIGdlb21fcG9pbnQoY29sb3I9IiNhNmJkZGIiKSsKICBnZW9tX3Ntb290aChtZXRob2Q9ICJsbSIpKwogIGxhYnModGl0bGUgPSAiMTB0aCBncmFkZSB2cy4gY29sbGVnZS5tYXJrIikKCmdyYWRlcGxvdDErZ3JhZGVwbG90MgpgYGAKCiMjIEZpdCB0aGUgbGluZWFyIG1vZGVsCgojIyMgU2NvcmUgd2l0aCBHZW5kZXIKCmBgYHtyfQpsbV9zY29yZTwtIGxtKGNvbGxlZ2UubWFya34gWDEwdGguTWFyaysgWDEydGguTWFyaysgR2VuZGVyLCBTQUIpCnRpZHkobG1fc2NvcmUsIGNvbmYuaW50ID0gVCkKYGBgCgokWV9pID0gXGJldGFfMCArIFxiZXRhXzFYX3tpMX0gKyBcYmV0YV8yWF97aTJ9ICsgXGJldGFfM1hfe2kzfSsgXGVwc2lsb25faSQsCgokWV9pJCBpcyB0aGUgc3R1ZGVudCdzIG1hcmtzIG9idGFpbmVkIGluIGNvbGxlZ2Ugb3IgdW5pdmVyc2l0eSwKCiRYX3tpMX0kIGlzIHRoZSBzdHVkZW50J3MgbWFya3Mgb2J0YWluZWQgaW4gdGhlIDEwdGggZ3JhZGUgaSwKCiRYX3tpMX0kIGlzIHRoZSBzdHVkZW50J3MgbWFya3Mgb2J0YWluZWQgaW4gdGhlIDEwdGggZ3JhZGUgaSwKCiRYX3tpM30kIGlzIGFuIGluZGljYXRvciBmb3IgbWFsZSBpLAoKVGhlIGVycm9ycyBhcmUgYXNzdW1lZCB0byBoYXZlIG1lYW4gMCwgY29uc3RhbnQgdmFyaWFuY2UsIGFuZCBhcmUgdW5jb3JyZWxhdGVkLgoKVGhlIG91dHB1dCBzaG93cyB0aGF0IGZlbWFsZSBzdHVkZW50cyBoYXZlIGJldHRlciBhY2FkZW1pYyBwZXJmb3JtYW5jZSB0aGFuIG1hbGUncy4gRmVtYWxlIHN0dWRlbnRzIGhhdmUgNi42IGhpZ2hlciBzY29yZSwgb24gYXZlcmFnZSwgYXMgbWFsZSBzdHVkZW50cyB3aG8gaGF2ZSB0aGUgc2FtZSAxMHRoIGdyYWRlIGFuZCB0aGUgc2FtZSAxMnRoIGdyYWRlLgoKCmBgYHtyfQpsbV9zY29yZTExPC0gbG0oY29sbGVnZS5tYXJrfiBYMTB0aC5NYXJrKyBYMTJ0aC5NYXJrKyBwYXJ0LnRpbWUuam9iLCBTQUIpCnRpZHkobG1fc2NvcmUxMSwgY29uZi5pbnQgPSBUKQpgYGAKCiMjIyBTY29yZSB3aXRob3V0IEdlbmRlcgpgYGB7cn0KbG1fc2NvcmUyPC0gbG0oY29sbGVnZS5tYXJrfiBYMTB0aC5NYXJrK1gxMnRoLk1hcmssIFNBQikKdGlkeShsbV9zY29yZTIsIGNvbmYuaW50ID0gVCkKYGBgCgojIyMgUmVncmVzc2lvbiBSZXNpZHVhbHMgRGlhZ25vc3RpY3MKCiMjIyMgUGxvdCBvZiByZXNpZHVhbHMgdnMgZml0dGVkIHZhbHVlcwoKYGBge3J9CmFvdXQgPC0gYXVnbWVudChsbV9zY29yZTIpCmdncGxvdChkYXRhID0gYW91dCwgbWFwcGluZyA9IGFlcyh4ID0gLmZpdHRlZCwgeSA9IC5yZXNpZCkpICsKICBnZW9tX3BvaW50KCkgKwogIGdlb21faGxpbmUoeWludGVyY2VwdCA9IDApKwogIGdlb21fc21vb3RoKCkKYGBgCgpSZXNpZHVhbHMgc2VlbSB0byBiZSBjZW50ZXJlZCBhdCAwIGZvciBhbGwgWCwgd2UgY29uY2x1ZGUgdGhhdCBhIGxpbmVhciBtb2RlbCBpcyBhcHByb3ByaWF0ZS4KCiMjIyMgUVEgcGxvdCBvZiByZXNpZHVhbHMKCgpXZSBuZWVkIHRvIGNoZWNrIGZvciBub3JtYWxpdHkgdG8gdmVyaWZ5IHRoYXQgd2UgY2FuIGRvIGEgcHJlZGljdGlvbiBpbnRlcnZhbCAKYGBge3J9CmdncGxvdChkYXRhID0gYW91dCwgbWFwcGluZyA9IGFlcyhzYW1wbGUgPSAucmVzaWQpKSArCiAgZ2VvbV9xcSgpICsKICBnZW9tX3FxX2xpbmUoY29sb3I9ImJsdWUiKQpgYGAKVGhpcyBldmFsdWF0ZXMgdGhlIG5vcm1hbGl0eSBvZiB0aGUgZXJyb3IgdGVybXMuIEFsdGhvdWdoIGl0IGhhcyBhIGxlZnQgbG9uZyB0YWlsLCBvdmVyYWxsIGxvb2tzIGdvb2QuCgojIyMgUHJlZGljdGlvbiAKCmBgYHtyfQpyYW5nZShTQUIkWDEwdGguTWFyaykKcmFuZ2UoU0FCJFgxMnRoLk1hcmspCmRmMSA8LSBkYXRhLmZyYW1lKFgxMHRoLk1hcmsgPSBjKDcwLCA4MCksIFgxMnRoLk1hcms9IGMoMzQsIDg3KSkKcHJlZGljdChsbV9zY29yZTIsIG5ld2RhdGEgPSBkZjEsIGludGVydmFsID0gImNvbmZpZGVuY2UiKQpgYGAKCkJhc2VkIG9uIHRoZSBvdXRwdXQgcHJvdmlkZWQsIHdlIHByZWRpY3QgdGhhdCBzdHVkZW50cyB3aG8gc2NvcmUgNzAgcG9pbnRzIGluIHRoZSAxMHRoIGdyYWRlIGFuZCAzNCBwb2ludHMgaW4gdGhlIDEydGggZ3JhZGUgYXJlIGxpa2VseSB0byBhY2hpZXZlIGFyb3VuZCA1NSBwb2ludHMgZm9yIHRoZWlyIGNvbGxlZ2UgZ3JhZGUuICg5NSUgQ29uZmlkZW50IEludGVydmFsIDQ5IHRvIDYxKSBTdHVkZW50cyBvYnRhaW5lZCA4MCBwb2ludHMgaW4gdGhlIDEwdGggZ3JhZGUsIGFuZCA4NyBwb2ludHMgaW4gdGhlIDEydGggZ3JhZGUgd2lsbCBnZXQgYWJvdXQgNzkgcG9pbnRzIGZvciBjb2xsZWdlIGdyYWRlLig5NSUgQ29uZmlkZW50IEludGVydmFsIDc1IHRvIDgyKQoKCioqKgojIENhcmVlciBPcmllbnRhdGlvbiBhbmQgQWNhZGVtaWMgQ2hvaWNlcwoKLSBIb3cgZG9lcyBzYXRpc2ZhY3Rpb24gd2l0aCB0aGVpciBkZWdyZWUgaW5mbHVlbmNlIHN0dWRlbnRzJyB3aWxsaW5nbmVzcyB0byBwdXJzdWUgYSBjYXJlZXIgaW4gdGhlaXIgZmllbGQgb2Ygc3R1ZHk/CmBgYHtyfQpTQUJfZGVncmVlPC1TQUIlPiUKICBncm91cF9ieShkZWdyZWVfcHJlZmVyKSU+JQogIGNvdW50KCklPiUKICBtdXRhdGUoZnJlcXVlbmN5ID0gbiAvIDIzNSkKClNBQl9kZWdyZWUyPC1TQUIlPiUKICBncm91cF9ieShkZWdyZWVfcHJlZmVyLCBEZXBhcnRtZW50KSU+JQogIGNvdW50KCklPiUKICBtdXRhdGUoZnJlcXVlbmN5ID0gbiAvIDIzNSkKClNBQl9kZWdyZWUKU0FCX2RlZ3JlZTIKYGBgCjkxJSBvZiBzdHVkZW50IGxpa2UgdGhlaXIgZGVncmVlLCBlc3BlY2lhbGx5IHRoZSBUaGUgQnVzaW5lc3MgQ2luZW1hdGljIEFydHMgKEJDQSkgcHJvZ3JhbSg0OSUpLgoKCgotIEFyZSBzdHVkZW50cyB3aG8gY29tcGxldGUgY2VydGlmaWNhdGlvbiBjb3Vyc2VzIG1vcmUgbGlrZWx5IHRvIGhhdmUgaGlnaGVyIHNhbGFyeSBleHBlY3RhdGlvbnMgYW5kIGEgd2lsbGluZ25lc3MgdG8gcHVyc3VlIHJlbGF0ZWQgY2FyZWVycz8KCgpgYGB7cn0KdC50ZXN0KFNBQiRzYWxhcnkuZXhwZWN0YXRpb24gfiBTQUIkQ2VydGlmaWNhdGlvbi5Db3Vyc2UpCmBgYApTaW5jZSB0aGUgcC12YWx1ZSAoMC4xMDU4KSBpcyBncmVhdGVyIHRoYW4gMC4wNSwgd2UgZmFpbCB0byByZWplY3QgdGhlIG51bGwgaHlwb3RoZXNpcy4gVGhlcmUgaXMgbm90IGVub3VnaCBldmlkZW5jZSB0aGF0IHRoZXJlIGlzIGEgc2lnbmlmaWNhbnQgZGlmZmVyZW5jZSBpbiBtZWFuIHNhbGFyeSBleHBlY3RhdGlvbnMgYmV0d2VlbiBzdHVkZW50cyB3aG8gY29tcGxldGVkIGNlcnRpZmljYXRpb24gY291cnNlcyBhbmQgdGhvc2Ugd2hvIGRpZCBub3QuCgoKYGBge3J9ClNBQiU+JQogIGdyb3VwX2J5KEdlbmRlciAsIENlcnRpZmljYXRpb24uQ291cnNlKSAlPiUKICBzdW1tYXJpc2UoTWVhblNhbGFyeSA9IG1lYW4oc2FsYXJ5LmV4cGVjdGF0aW9uKSkKYGBgCgoqKioKIyBBcHBlbmRpeAoKYGBge3IgQXBwZW5kaXh9CiN8IHJlZi5sYWJlbD1rbml0cjo6YWxsX2xhYmVscygpLAojfCBlY2hvID0gVFJVRSwKI3wgZXZhbCA9IEZBTFNFCmBgYA==